home *** CD-ROM | disk | FTP | other *** search
/ Acorn RISC PD-CD 1 / Acorn RISC PD-CD 1.iso / languages / c / gnu / readme < prev   
Encoding:
Text File  |  1993-04-27  |  14.0 KB  |  396 lines

  1. GCC unter Acorn's RISC-OS
  2. -------------------------
  3.  
  4.  
  5. 0. Installation
  6.    ------------
  7.  
  8. Die Installation beschraenkt sich auf:
  9.  
  10.   1. RUN$Path um das Verzeichnis, in dem sich die GNU C executables befinden, ergaenzen (exe.)
  11.   2. Umgebungsvariable CPATH auf das Verzeichnis setzen, in dem sich die Header-Dateien befinden
  12.      CPATH darf auch - durch ';' getrennt - mehrere Verzeichnisse enthalten.
  13.      Bsp.: Befinden sich Ihre Header-Dateien in $.clib.1.h und $.clib.2.h, dann setzen Sie CPATH
  14.            auf '$.clib.1;$.clib.2'
  15.      Bei Bedarf koennen auch die Variablen C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH,
  16.      OBJCPLUS_INLCUDE_PATH gesetzt werden (CPLUS_INCLUDE_PATH z.B. wird nur benutzt, wenn ein
  17.      C++-Quelltext compiliert wird).
  18.   3. Unter Umstaenden Stubs und RISC_OSlib konvertieren (s.u.)
  19.   4. Ich empfehle, die Variable mulib$Path auf den vollen Namen des RISCLIB-Verzeichnisses zu
  20.      setzen. Die Libraries koennen dann einfach mit mulib:stubsmu und mulib:oslib_mu angesprochen
  21.      werden.
  22.   5. Die Dokumentation zu Compiler und Assembler finden Sie im Verzeichnis 'DOK'
  23.  
  24.  
  25.  
  26. 1. Prefixes in Dateinamen
  27.    ----------------------
  28.  
  29. Unter Unix ist es ueblich, nicht wie unter RISC-OS, Dateitypen wie .c .o .cc dem eigentlichen
  30. Dateinamen als Endung mitzugeben. GCC erwartet deshalb alle Dateinamen in diesem Format. Um
  31. konkret auf die Dateien zuzugreifen, wird aber die Endung dem Namen vorangestellt. So wird aus
  32. 'GCC sample.c' ein 'GCC c.sample'. ACHTUNG: anders als z.B. bei Norcroft C wird aber aus bspw.
  33. 'irgend.sample.c' 'c.irgend.sample'.
  34. GCC benutzt die Endungen, um herauszufinden, um was fuer eine Datei es sich handelt. Deshalb
  35. darf die Endung nie vorangestellt werden.
  36.  
  37. Die Endungen bedeuten:
  38.  
  39.   .c    C Source
  40.   .cc, .cxx, .C   C++ Source (Achtung: nur .cc sollte unter RISC-OS verwendet werden)
  41.   .m    objective-C Source  (im Moment nicht unterstuetzt)
  42.   .o    object file
  43.   .h    header file
  44.   .i    pre-processed file (cpp output)
  45.   .ii   pre-processed C++ file
  46.   .s    assembler source
  47.   .S    assembler source (needs pre-processing)
  48.  
  49.  
  50.  
  51.  
  52. 2. Optionen fuer GCC
  53.    -----------------
  54.  
  55. Eine genaue Erklaerung der einzelnen Optionen finden Sie in der Datei 'invoke' (tex.texinfo).
  56. Hier: Das Meiste ist gleich wie bei anderen C-Compilern auch. Nicht vergessen sollten Sie aber
  57. die Option -O oder gar -O2 (optimieren). Ohne diese Option erzeugt der Compiler ziemlich
  58. ineffizienten Code.
  59.  
  60. Maschinenabhaengige Optionen:
  61.   -mno-apsc  verwenden der C-Aufrufkonvention fuer Funktionen
  62.   -mcoproc   Koprozessor ist vorhanden (aus Optimierungsgruenden, funktioniert auch ohne)
  63.   -mpoke-function-name  Funktionsnamen fuer post mortem debugger im Code aufnehmen
  64.  
  65.  
  66.  
  67.  
  68. 3. Include-Dateien
  69.    ---------------
  70.  
  71. Bei Include-Dateien wird wieder die Prefix-Schreibweise fuer Dateitypen verwendet. In den Quell-
  72. texten darf aber die Suffix-Schreibweise verwendet werden. Der pre-processor wandelt diese in
  73. Prefix um und erkennt ausserdem aus Unix stammende Verzeichnispfade. Aus /usr/include/sys/times.h
  74. wird also $.usr.include.sys.h.times, aus ../my-header.h wird ^.h.my-header. Erkannt werden aber
  75. nur die Endungen .h und .c.
  76.  
  77. Suchreihenfolge fuer Include-Dateien:
  78.  
  79.   1. aktuelles Verzeichnis oder mit -I angegebene Verzeichnisse
  80.   2. der in der Umgebungsvariablen CPATH enthaltene Pfad
  81.   3. der Pfad aus entweder C_INCLUDE_PATH (Standard C), CPLUS_INCLUDE_PATH (C++),
  82.      OBJC_INCLUDE_PATH (Objective C) oder OBJCPLUS_INLCUDE_PATH (Objective C++)
  83.  
  84. Die in Umgebungsvariablen abgelegten Pfade duerfen mehrere Verzeichnisse enthalten (duchr ';'
  85. getrennt). Die Unix-Schreibweise darf auch hier verwendet werden. Anders als bei RISC-OS ueblich
  86. darf der '.' bzw. '/' nicht letztes Zeichen in einem Verzeichnis-Namen sein (er wird vom Pre-
  87. Prozessor hinzugefuegt). Ebenso gehoert das '.h.' nicht in den Pfad.
  88.  
  89.  
  90.  
  91.  
  92. 4. Linker
  93.    ------
  94.  
  95. Leider muss der Linker-Aufruf explizit aufgefuehrt werden (also mit GCC die Option -c verwenden).
  96. Um 'absolute'-code zu erzeugen muss der Linker z.B. wie folgt aufgerufen werden:
  97.  
  98.   mulink -F -a32768 -osample -C o.sample1 o.sample2 mulib:stubsmu
  99.   settype sample absolute
  100.  
  101. Voraussetzung: mulib$path enthaelt den Verzeichnisnamen in dem stubsmu sich befindet.
  102. Dabei bedeuten:
  103.  
  104.   -F       erstes Objekt der ersten Datei auf jeden Fall linken (sonst nur, wenn referenziert)
  105.            wenn mit stubsmu gelinkt wird, ist diese Option nicht unbedingt notwendig, da
  106.            stubsmu das Obligatory-Link-Flag gesetzt hat (also auf jeden Fall gelinkt wird) und
  107.            ausserdem eine Referenz nach 'main' enthaelt.
  108.   -a32768  Absoluten Code zum Ausfuehren auf Adresse 8000h erzeugen
  109.   -osample den output in die Datei sample schreiben (Bitte KEIN Leerzeichen)
  110.   -C       nur den Code ohne Header, Publics, Relocs schreiben
  111.  
  112. Tut mir leid, dass so viele Optionen noetig sind. Aber der Linker war urspruenglich nicht fuer
  113. RISC-OS gedacht.
  114. Werden uebrigens die -a und -C Optionen weggelassen, so wird ein Object-file erzeugt.
  115.  
  116. Weitere Optionen:
  117.  
  118.   -x       eine Liste von Symbolen und Modulen und ihren Adressen (bzw. Offsets) ausgeben
  119.   -+       C++ - Code linken. D.h. Symbolnamen werden C++-like gesucht und - wenn nicht auf-
  120.            findbar in Standard-C-Namen umgewandelt.
  121.            Bsp.: printf( "%d", 10 ) in C++ erzeugt einen Assembler-Aufruf der Form
  122.                  ... bl printf__FPci. Falls ein Symbol printf__FPci existiert, wird der Linker
  123.                  einen Aufruf zu diesem Symbol generieren, andernfalls (mit eingeschalteter
  124.                  -+ Option) zus. den Namen printf ausprobieren (ohne den __F... - Teil).
  125.   -$<suffix> die Zeichenfolge, die in C++-Bezeichnern den eigentl. Funktionsnamen und die
  126.            Typenangabe trennt, einstellen. Voreinstellung: __F.
  127.   -d       keine Liste der doppelt definierten Publics ausgeben
  128.   -u       keine Liste der undefinierten Externals ausgeben
  129.  
  130. Alle anderen Optionen sind fuer RISC-OS bedeutungslos bzw. nicht empfehlenswert.
  131.  
  132. Stubs sollte auf jeden Fall vor der RISC_OSlib gelinkt werden. Ausserdem sollte die Datei, die
  133. die Funktion main enthaelt als erste gelinkt werden. Im Uebrigen spielt die Link-Reihenfolge
  134. keine Rolle. Objekte, die von keinem gelinkten Objekt referenziert werden, werden ignoriert, z.B.
  135. wird beim Linker-Aufruf
  136.  
  137.   mulink -F o.sample1 o.sample2 mulib:stubsmu
  138.  
  139. o.sample2 nicht gelinkt, wenn weder von mulib:stubsmu noch von o.sample1 eine Funktion oder Variable
  140. aus o.sample1 referenziert wird.
  141.  
  142. Wenn mit Stubs gelinkt wird, wird normalerweise die Meldung
  143.  
  144.   unresolved external(s)
  145.     '__root_stack_size' in module 'Stub$$Code'
  146.     '__RelocCode' in module 'Stub$$Code'
  147.  
  148. erscheinen. Diese beiden Referenzen sind in der AOF-Datei als 'weak binding' gekennzeichnet,
  149. muessen also nicht unbedingt erfuellt werden. Applikationen werden also trotz dieser Meldung
  150. korrekt gelinkt.
  151.  
  152. Wenn mit der RISC_OSlib gelinkt wird, erscheint ausserdem die Meldung
  153.  
  154.   warning: double defined public variable(s):
  155.     'C$$code' in module 'C$$code'
  156.     'C$$code' in module 'C$$code'
  157.  
  158. Empfohlene Reaktion: Einfach ignorieren.
  159.  
  160.  
  161.  
  162.  
  163. 5. AOFConvert
  164.    ----------
  165.  
  166. AOFConvert ist ein utility, das Objekt-Dateien im AOF-Format ins MUPROS-Format konvertiert.
  167. Verwendet wird es wie:
  168.  
  169.   AOFConvert -l -osample o.sample
  170.  
  171. Die Option -l unterdrueckt alle Warnungen (die sind sowieso ueberfluessig). Unter Umstaenden
  172. kann es noetig sein, auch die Option -O einzusetzen. Dann wird das so konvertierte Objekt auf
  173. jeden Fall gelinkt, wenn es irgendwann im Zusammenhang mit MULINK gebraucht wird, selbst wenn
  174. keine Referenz damit erfuellt wird.
  175.  
  176.  
  177.  
  178.  
  179. 6. Assembler
  180.    ---------
  181.  
  182. Wer den Assembler benutzen moechte sei auf die entsprechende Texinfo-Datei (Dok.) und auf das
  183. RISC-OS Referenz-Handbuch verwiesen. Soviel hier: aufgerufen wird er wie
  184.  
  185.   as -o o.sample s.sample
  186.  
  187. Erzeugt wird eine Objekt-Datei im MUPROS-Format.
  188. Achtung: Assembler-Befehle werden kleingeschrieben, Registerangaben duerfen auch gross ge-
  189. schrieben werden.
  190. ARM/MUPROS-spezifische Pseudo-Befehle:
  191.  
  192.   .objname <name>    benennt das gerade Assemblierte Objekt mit <name> (Default: Dateiname)
  193.   .segid <name>      die segment ID wird zu <name> (Default: 'code')
  194.   .segattr <'RO'|'RW'> Read-only oder Read-Write Segment (Default: 'RW')
  195.  
  196. Im Moment unterstuetzt der Assembler keine getrennten Code- und Daten- und Null-initialisierte
  197. Segmente (.text, .data, .bss), ausser diese werden in getrennten Dateien assembliert.
  198.  
  199. Ein Beispiel eines Assembler-Quelltextes ist risclib.s.div-fast. Weitere Beispiele lassen sich
  200. mit GCC -O -S ... erzeugen.
  201.  
  202. Eine vollstaendige Liste der Assembler-Befehle (Auszug aus dem Quelltext):
  203.  
  204. /* format of the assembler string :
  205.    
  206.    %<bitfield>r         print as an ARM register
  207.    %<bitfield>f         print a floating point constant if >7 else an fp register
  208.    %c                   print condition code (always bits 28-31)
  209.    %P                   print floating point precision in arithmetic insn
  210.    %Q                   print floating point precision in ldf/stf insn
  211.    %R                   print floating point rounding mode
  212.    %<bitnum>'c          print specified char iff bit is one
  213.    %<bitnum>-<len>'c    print specified char iff bit is one and length of command after c is at least len
  214.    %<bitnum>`c          print specified char iff bit is zero
  215.    %<bitnum>?ab         print a if bit is one else print b
  216.    %p                   print 'p' iff bits 12-15 are 15
  217.    %o                   print operand2 (immediate or register + shift)
  218.    %a                   print address for ldr/str instruction
  219.    %b                   print branch destination
  220.    %A                   print address for ldc/stc/ldf/stf instruction
  221.    %m                   print register mask for ldm/stm instruction
  222.    %s                   print bits 0-23 as swi number/name
  223.    %L                   print ldm type (fd, ea and the like ...)
  224.    %S                   print stm type
  225.    %r                   print adr operand
  226.  
  227.     /* ARM instructions */
  228. "mul%c%20's %16-19r,%0-3r,%8-11r",
  229. "mla%c%20's %16-19r,%0-3r,%8-11r,%12-15r",
  230. "and%c%20's %12-15r,%16-19r,%o",
  231. "eor%c%20's %12-15r,%16-19r,%o",
  232. "sub%c%20's %12-15r,%16-19r,%o",
  233. "rsb%c%20's %12-15r,%16-19r,%o",
  234. "add%c%20's %12-15r,%16-19r,%o",
  235. "adr%c%20's %12-15r,%r",
  236. "adc%c%20's %12-15r,%16-19r,%o",
  237. "sbc%c%20's %12-15r,%16-19r,%o",
  238. "rsc%c%20's %12-15r,%16-19r,%o",
  239. "tst%c%p %16-19r,%o",
  240. "teq%c%p %16-19r,%o",
  241. "cmp%c%p %16-19r,%o",
  242. "cmn%c%p %16-19r,%o",
  243. "orr%c%20's %12-15r,%16-19r,%o",
  244. "mov%c%20's %12-15r,%o",
  245. "bic%c%20's %12-15r,%16-19r,%o",
  246. "mvn%c%20's %12-15r,%o",
  247. "str%c%22'b %12-15r,%a",
  248. "ldr%c%22'b %12-15r,%a",
  249. "stm%c%S %16-19r%21'!,%m",
  250. "ldm%c%L %16-19r%21'!,%m%22'^",
  251. "b%24-2'l%c%24'l %b",
  252. "swi%c %s",
  253. /* Floating point coprocessor instructions */
  254. "adf%c%P%R %12-14f,%16-18f,%0-3f",
  255. "muf%c%P%R %12-14f,%16-18f,%0-3f",
  256. "suf%c%P%R %12-14f,%16-18f,%0-3f",
  257. "rsf%c%P%R %12-14f,%16-18f,%0-3f",
  258. "dvf%c%P%R %12-14f,%16-18f,%0-3f",
  259. "rdf%c%P%R %12-14f,%16-18f,%0-3f",
  260. "pow%c%P%R %12-14f,%16-18f,%0-3f",
  261. "rpw%c%P%R %12-14f,%16-18f,%0-3f",
  262. "rmf%c%P%R %12-14f,%16-18f,%0-3f",
  263. "fml%c%P%R %12-14f,%16-18f,%0-3f",
  264. "fdv%c%P%R %12-14f,%16-18f,%0-3f",
  265. "frd%c%P%R %12-14f,%16-18f,%0-3f",
  266. "pol%c%P%R %12-14f,%16-18f,%0-3f",
  267. "mvf%c%P%R %12-14f,%0-3f",
  268. "mnf%c%P%R %12-14f,%0-3f",
  269. "abs%c%P%R %12-14f,%0-3f",
  270. "rnd%c%P%R %12-14f,%0-3f",
  271. "sqt%c%P%R %12-14f,%0-3f",
  272. "log%c%P%R %12-14f,%0-3f",
  273. "lgn%c%P%R %12-14f,%0-3f",
  274. "exp%c%P%R %12-14f,%0-3f",
  275. "sin%c%P%R %12-14f,%0-3f",
  276. "cos%c%P%R %12-14f,%0-3f",
  277. "tan%c%P%R %12-14f,%0-3f",
  278. "asn%c%P%R %12-14f,%0-3f",
  279. "acs%c%P%R %12-14f,%0-3f",
  280. "atn%c%P%R %12-14f,%0-3f",
  281. "flt%c%P%R %16-18f,%12-15r",
  282. "fix%c%P%R %12-15r,%0-2f",
  283. "wfs%c %12-15r",
  284. "rfs%c %12-15r",
  285. "wfc%c %12-15r",
  286. "rfc%c %12-15r",
  287. "cmf%c %16-18f,%0-3f",
  288. "cnf%c %16-18f,%0-3f",
  289. "cmfe%c %16-18f,%0-3f",
  290. "cnfe%c %16-18f,%0-3f",
  291. "stf%c%Q %12-14f,%A",
  292. "ldf%c%Q %12-14f,%A",
  293.  
  294.  
  295.  
  296.  
  297. 6. Stubs / RISC_OSlib
  298.    ------------------
  299.  
  300. Mit dem GNU C/C++ Compiler sollten Sie auch die konvertierten Versionen von Stubs und RISC_OSlib
  301. erhalten haben (stubsmu und oslib_mu im Verzeichnis risclib). Sollte dies nicht der Fall sein,
  302. so koennen Sie diese mit der Obey-Datei risclib.makelibs erzeugen.
  303.  
  304. Noch einmal: Stubs immer vor RISC_OSlib linken.
  305.  
  306.  
  307.  
  308.  
  309. 7. Eigene Bibliotheken
  310.    -------------------
  311.  
  312. Eigene Bibliotheken werden wie folgt erstellt:
  313.  
  314.   1. Einzelne Module compilieren
  315.   2. Objekte zu einer Datei zusammensetzen (z.B. mit fappend)
  316.  
  317. Uebrigens bedeutet 
  318.  
  319.   mulink .... o.sample1 o.sample2
  320.  
  321. genau dasselbe wie
  322.  
  323.   fappend o.sample1 o.sample2
  324.   mulink .... o.sample1
  325.  
  326. Es darf deshalb jede Art von MUPROS-Objekt-Dateien einfach zusammengefuegt werden: 'Bundling'
  327. a la MUPROS.
  328.  
  329. !AUFRUF!: Wer irgend eine geniale Funktions- oder Klassen-Sammlung geschrieben hat, soll sie
  330. --------  doch bitte den anderen RISC-OS-Benuetzern zur Verfuegung stellen. Am besten an
  331. untenstehende Adresse schicken. Ich werde versuchen, alles ankommende aufeinander abzustimmen
  332. und weiterzuverteilen. Ich hoffe, es kommt was (von mir sicher frueher oder spaeter, ich habe
  333. aber leider noch andere Projekte).
  334.  
  335.  
  336.  
  337.  
  338. 8. Objective C
  339.    -----------
  340.  
  341. Die aktuelle RISC-OS-Version von GNU C/C++ unterstuetzt Objective C nicht. Wer einen ent-
  342. sprechenden Bedarf hat, soll sich doch bitte bei untenstehender Adresse melden.
  343.  
  344.  
  345.  
  346.  
  347. 9. "Support"
  348.    ---------
  349.  
  350. In vielen Mailboxen finden Sie Konferenzen zum Thema GNU C/C++. Wer Zugang zum Internet bzw.
  351. zu den UUCP-News hat, kann sich an die Newsgroups gnu.g++... wenden. Ausserdem stehe ich -
  352. besonders fuer RISC-OS-spezifische Probleme - zur Verfuegung:
  353.  
  354. Thomas Aeby
  355. Graeffet 406
  356. 1735 Giffers
  357. Schweiz
  358. Tel. 037 38 16 00
  359. EMail aeby@uropax.contrib.de
  360.  
  361.  
  362.  
  363.  
  364. 10. Quelltexte
  365.     ----------
  366.  
  367. Alle Quelltexte zum Compiler und zum Assembler sind bei obenstehender Adresse erhaeltlich.
  368.  
  369.  
  370.  
  371.  
  372. 11. Fliesskomma-Arithmetik
  373.     ----------------------
  374.  
  375. Fliesskomma-Arithmetik steht nun trotz gegenteiliger Ankuendigung doch schon zur Verfuegung.
  376. Aber: Keine Funktionsgarantie - kaum getestet.
  377.  
  378.  
  379.  
  380.  
  381. 12. Speicherbedarf
  382.     --------------
  383.  
  384. Um C++-Programme compilieren zu koennen sind ueber 2MByte freier Speicher noetig. Standard C
  385. kommt mit weniger aus, braucht aber immer noch so ca. 1.2-2MByte. Fehlermeldungen wie 'virtual
  386. Memory exhausted' zeigen Speichermangel an.
  387.  
  388.  
  389.  
  390.  
  391.  
  392. 13. Debugger
  393.     --------
  394.  
  395. Sorry, wird nicht unterstuetzt. Auf Assembler-Level ist natuerlich sowohl der !DDT als auch
  396. Debug einsetzbar, Source-Level-Debugging is' aber nicht.